#pragma once

#include <iostream>
#include <signal.h>
#include "TcpServer.hpp"
#include "Task.hpp"
#include "ThreadPool.hpp"
#include "Log.hpp"

#define PORT 8081

class HttpServer
{
private:
    int _port;// 端口号
public:
    HttpServer(int port)
        :_port(port)
    {}
    ~HttpServer()
    {}

    // 初始化服务器
    void InitServer()
    {
        signal(SIGPIPE, SIG_IGN); // 直接粗暴处理cgi程序写入管道时崩溃的情况，忽略SIGPIPE信号,避免因为一个被关闭的socket连接而使整个进程终止
    }

    // 启动服务器
    void Loop()
    {
        LOG(INFO, "loop begin");
        TcpServer* tsvr = TcpServer::GetInstance(_port); // 获取TCP服务器单例对象
        int listen_sock = tsvr->Sock(); // 获取单例对象的监听套接字
        while(true)
        {
            struct sockaddr_in peer;
            memset(&peer, 0, sizeof(peer));
            socklen_t len = sizeof(peer);
            int sock = accept(listen_sock, (struct sockaddr*)&peer, &len);// 跟客户端建立连接
            if (sock < 0)
            {
                continue;
            }

            // 打印客户端信息
            std::string client_ip = inet_ntoa(peer.sin_addr);
            int client_port = ntohs(peer.sin_port);
            LOG(INFO, "get a new link:[" + client_ip + ":" + std::to_string(client_port) + "]");

            // 搞个线程池，代替下面简单的线程分离方案
            // 构建任务并放入任务队列
            Task task(sock);
            ThreadPool::GetInstance()->PushTask(task);

            // 创建新线程处理新连接发起的Http请求
            // int *p = new int(sock);
            // pthread_t tid;
            // pthread_create(&tid, nullptr, CallBack::HandlerRequest, (void*)p);// 线程创建，回调函数
            // pthread_detach(tid);// 线程分离
        }
    }
};

